package com.gyg.crud.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.gyg.crud.beans.Employee;
import com.gyg.crud.beans.Msg;
import com.gyg.crud.service.EmployeeService;

/**
 * 锟斤拷锟斤拷员锟斤拷CRUD锟斤拷锟斤拷
 */
@Controller
public class EmployeeController {

	@Autowired
	EmployeeService employeeService;

	/**
	 * 单个批量删除二合一
	 * 批量删除：1-2-3
	 * 
	 * @param id
	 * @return
	 */
	@RequestMapping(value="/emp/{id}",method=RequestMethod.DELETE)
	@ResponseBody
	public Msg deleteEmpBy(@PathVariable("id") String ids) {
//		如果带有“-”表示存在多个id连接
//		批量删除
		if (ids.contains("-")) {
			List<Integer> idsList = new ArrayList<Integer>();
			String[] idsArr = ids.split("-");
//			组装id的集合
			for (String strID : idsArr) {
				int parseInt = Integer.parseInt(strID);
				idsList.add(parseInt);
			}
			employeeService.deleteBatch(idsList);
		} else {
			// 单个删除
			int id = Integer.parseInt(ids);
			employeeService.deleteEmpById(id);
		}
		
		return Msg.success();
	}
	
	/**
	 * 修改员工信息
	 * 如果ajax直接发送PUT请求，封装的数据中，
	 * Employee [empId=1014, empName=null, gender=null, email=null, dId=null, department=null]
	 * 
	 * 问题：
	 * 请求体中有数据，但是employee封装不上
	 * 
	 * 解决方案：
	 * 如果更新支持直接发送PUT请求还能封装请求体中的数据，
	 * 1、配置上HttpPutFormContentFilter，spring5之后是PutFormContentFilter
	 * 2、它的作用是将请求体中的数据封装成一个map
	 * 3、request会被重新包装，request.getParameter()会被重写，这样就会从自己封装的map中取出数据
	 * 
	 * @param employee
	 * @return
	 */
	@RequestMapping(value="/emp/{empId}",method=RequestMethod.PUT)
	@ResponseBody
	public Msg updateEmp(Employee employee) {
		System.out.println("更新的信息：" + employee);
		employeeService.updateEmp(employee);
		return Msg.success();
	}
	
	/**
	 * 根据获取员工信息
	 * @return
	 */
	@RequestMapping(value="/emp/{id}",method=RequestMethod.GET)
	@ResponseBody
	public Msg getEmp(@PathVariable("id") Integer id) {
		Employee employee = employeeService.getEmp(id);
		return Msg.success().add("emp", employee);
	}
	
	/**
	 * 校验用户名是否可用
	 * @param empName
	 * @return
	 */
	@RequestMapping("/checkuser")
	@ResponseBody
	public Msg checkUserName(@RequestParam(value="empName") String empName) {
		// 先判断用户是否是合法的表达式
		String regx = "(^[a-zA-Z0-9_-]{3,16}$)|(^[\u2E80-\u9FFF]{2,5})";
		boolean matches = empName.matches(regx);
		if (!matches) {
			return Msg.fail().add("va_msg", "用户名必须是3~16位字母或2~5位汉字");
		} 
		
//		数据库用户名重复校验
		Boolean isok = employeeService.checkUserName(empName);
//		System.out.println(empName + "校验控制器*********************" + isok);
		if (isok) {
			return Msg.success();
		}else{
			return Msg.fail().add("va_msg", "用户名重复！");
		}
	}
	
	
	/**
	 * 保存员工数据
	 * 1、（JSR303后端校验）
	 * 2、导入hibernate-validator-6.2.0.Final.jar
	 * 3、在bean中加入校验规则
	 * 4、控制器中使用Valid注解执行校验，
	 * 5、BindingResult接收校验结果
	 * @return
	 */
	@RequestMapping(value="/emp",method=RequestMethod.POST)
	@ResponseBody
	public Msg saveEmp(Employee employee) {
//		如果校验失败，返回失败，在模态框中显示校验失败的错误信息
		/*if (result.hasErrors()) {
			Map<String, Object> map = new HashMap<String, Object>();
			List<FieldError> fieldErrors = result.getFieldErrors();
			for (FieldError fieldError : fieldErrors) {
				System.out.println("错误的的字段名：" + fieldError.getField());
				System.out.println("错误的信息" + fieldError.getDefaultMessage());
				map.put(fieldError.getField(), fieldError.getDefaultMessage());
			}
//			返回校验失败
			return Msg.fail().add("errorFields", map);
		}*/
		
//		后端校验成功后才能执行保存
		System.out.println("执行保存+++++++++++++++++++++++++++++++++++");
		employeeService.saveEmp(employee);
		return Msg.success();
	}
	
	
	/**
	 * 返回的数据携带json字符串 需要导入jackson包
	 * 
	 * @param pn
	 * @param model
	 * @return
	 */
	@RequestMapping("/emps")
	@ResponseBody
	public Msg getEmpsWithJson(@RequestParam(value = "pn", defaultValue = "1") Integer pn) {
		// 传入需要跳转的页面以及展示的数据量
		PageHelper.startPage(pn, 5);
		// 获取到全部数据
		List<Employee> employees = employeeService.getAll();
//		System.out.println("查询到的数据：");
		System.out.println(employees);

		// 使用pageinfo包装查询的数据，只需要将pageinfo交给页面即可
		// 传入数据，以及要显示多少页

		PageInfo page = new PageInfo(employees, 5);
//		System.out.println("封装数据：");
//		System.out.println(page);
//		把查询到的信息封装到msg中
		return Msg.success().add("pageinfo", page);
	}

	/**
	 * 查询员工数据（分页查询）
	 * @return
	 */
//	 @RequestMapping("/emps")
	public String getEmps(
			@RequestParam(value = "pn", defaultValue = "1") Integer pn,
			Model model) {
		// 传入需要跳转的页面以及展示的数据量
		PageHelper.startPage(pn, 5);
		// 获取到全部数据
		List<Employee> employees = employeeService.getAll();
		// 使用pageinfo包装查询的数据，只需要将pageinfo交给页面即可
		// 传入数据，以及要显示多少页
		PageInfo page = new PageInfo(employees, 5);
//		model.addAttribute("pageinfo", page);
		return "list";
	}
}
